package kasanova.sis.jsf.util;

import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.faces.FacesException;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.model.SelectItem;
/**
 * 
 * @author rafael.benzaquem.ufpa@gmail.com
 */
public class JsfUtil {

    public static SelectItem[] getSelectItems(List<?> entities, boolean selectOne) {
        int size = selectOne ? entities.size() + 1 : entities.size();
        SelectItem[] items = new SelectItem[size];
        int i = 0;
        if (selectOne) {
            items[0] = new SelectItem("", "---");
            i++;
        }
        for (Object x : entities) {
            items[i++] = new SelectItem(x, x.toString());
        }
        return items;
    }

    public static void addErrorMessage(Exception ex, String defaultMsg) {
        String msg = ex.getLocalizedMessage();
        if (msg != null && msg.length() > 0) {
            addErrorMessage(msg);
        } else {
            addErrorMessage(defaultMsg);
        }
    }

    public static void addErrorMessages(List<String> messages) {
        for (String message : messages) {
            addErrorMessage(message);
        }
    }

    public static void addErrorMessage(String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error!", msg);
        FacesContext.getCurrentInstance().addMessage(null, facesMsg);
    }

    public static void addSuccessMessage(String msg) {
        FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Sucesso!", msg);
        FacesContext.getCurrentInstance().addMessage("successInfo", facesMsg);
    }

    public static String getRequestParameter(String key) {
        return FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get(key);
    }

    public static Object getObjectFromRequestParameter(String requestParameterName, Converter converter, UIComponent component) {
        String theId = JsfUtil.getRequestParameter(requestParameterName);
        return converter.getAsObject(FacesContext.getCurrentInstance(), component, theId);
    }

    /**
     *
     *
     * @param pagePath
     * @return
     */
    public static String redirectPage(String pagePath) {
        FacesContext ctx = FacesContext.getCurrentInstance();
        ExternalContext extContext = ctx.getExternalContext();

        String contextPath = ctx.getExternalContext().getRequestContextPath();
        try {
            extContext.redirect(contextPath + pagePath);
        } catch (IOException ex) {
            throw new FacesException(ex);
        }
        return contextPath + pagePath;
    }

    public static Date formatarHoraData(Date date, int hora, int minutos) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, hora);
        calendar.set(Calendar.MINUTE, minutos);
        return calendar.getTime();
    }

    public static Date subtraiMinutos(Date date, int minutos) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.setTimeInMillis(date.getTime() - minutos * 60 * 1000);
        return calendar.getTime();
    }

    public static Date adicionaMinutos(Date date, int minutos) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.setTimeInMillis(date.getTime() + minutos * 60 * 1000);
        return calendar.getTime();
    }
}